package CapaLogica;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.DocumentException;
import datechooser.beans.DateChooserCombo;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import CapaDatos.*;
import CapaGrafica.ventanaInfoReserva;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import ve.edu.ucab.cliente.ClienteSocket;

/**
 *
 * @author Usuario
 */
public class ComunicaReserva {
    private static Reserva laReserva = new Reserva();

   /**
    *
    * @return la reserva
    */

    public Reserva getLaReserva() {
        return laReserva;
    }

    /**
     * firma para registar la reserva al sistema
     * @param inicio fecha de inicio de la reserva
     * @param fin fecha de fin de la reserva
     * @param jLCedula cedula del cliente
     * @param jCTipoHab el tipo de habitacion (normal/cabaña)
     * @return uno (1) si se creo la reserva, (-1) si no se creo y cero (0) si hay algun campo vacio
     * @throws FileNotFoundException
     * @throws BadElementException
     * @throws MalformedURLException
     * @throws IOException
     * @throws DocumentException
     */

    public int RegistrarReserva(DateChooserCombo inicio,DateChooserCombo fin,JLabel jLCedula, JComboBox jCTipoHab) throws FileNotFoundException, BadElementException, MalformedURLException, IOException, DocumentException
 {

    if(validarDatosReserva(inicio, fin, jCTipoHab)==true && ver (inicio,fin)==true)
    {
        boolean seCreo = crearNodoReserva(inicio, fin,jLCedula.getText(), jCTipoHab);
         if(seCreo)
             return 1;
         else if(!seCreo)
             return -1;
    }
    return 0;
 }

    /**
     * firma para crear la reserva
     * por medio de la libreria JSokets
     * @param inicio fecha de inicio de la reserva
     * @param fin fecha fin de la reserva
     * @param cedula cedula del clietne
     * @param jCTipoHab tipo de habitacion (normal/cabaña)
     * @return TRUE si creo bien la reserva con todo los datos F
     * @return ALSE no se creo la reserva
     * @throws FileNotFoundException
     * @throws BadElementException
     * @throws MalformedURLException
     * @throws IOException
     * @throws DocumentException
     */

    public boolean crearNodoReserva(DateChooserCombo inicio, DateChooserCombo fin,String cedula, JComboBox jCTipoHab) throws FileNotFoundException, BadElementException, MalformedURLException, IOException, DocumentException
    {

        ComunicaCliente comunicameACliente = new ComunicaCliente();
        String fechaI,fechaF,id,tipoHab="";
        fechaI =inicio.getText();
        fechaF = fin.getText();
        tipoHab = (String) jCTipoHab.getSelectedItem();

        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        Date fechaDate = new Date();
        String fechaActual = formato.format(fechaDate);
        DireccionIP IP = new DireccionIP();
        IP.abrirArchivoTxt();
        String ip = IP.getDireccionIp();
        String idHab = String.valueOf(generarIdHab());

          ClienteSocket cliente = new ClienteSocket();
          String resultado = cliente.ejecutarPeticion("2:"+fechaI+":"+fechaF+":"+fechaActual+":"+idHab+":"+cedula,ip, 7687);

          String [] res = resultado.split(":");

          if(res[0].equalsIgnoreCase("true"))
             {
                 id = res[1];
                 JOptionPane.showMessageDialog(inicio, "Su id de reserva es "+id);
                        laReserva.setElCliente(comunicameACliente.getElCliente());
                        laReserva.setFechaInicio(fechaI);
                        laReserva.setFechaFin(fechaF);
                        laReserva.setIdHab(idHab);
                        laReserva.setID(Integer.parseInt(id));
                        return true;
             }

             else{
                  JOptionPane.showMessageDialog(null, "Operacion Fallida "+ res[1], "Error", JOptionPane.ERROR_MESSAGE);
                  return false;
             }
        }

   /**
    * firma para calcular el monto de la reserva
    * @return retorna el monto a pagar
    */
public double recibirMonto()
{
    ClienteSocket cliente = new ClienteSocket();
    String cedula = laReserva.getElCliente().getCedula();
    Integer id = laReserva.getID();
    Double monto = 0.0;

    String resultado2 = cliente.ejecutarPeticion("6"+":"+cedula+":"+id.toString(), "localhost", 7687);
                  String [] res2 = resultado2.split(":");
                    if(res2[0].equalsIgnoreCase("true"))
                    {
                        monto = Double.parseDouble(res2[1]);
                        laReserva.setMonto(monto);
                        return monto;
                    }
                    else{
                      JOptionPane.showMessageDialog(null, "Operacion Fallida "+ res2[1], "Error",
                            JOptionPane.ERROR_MESSAGE);
                    }
      return 0;
}

/**
 * firma que verifica que todos los campos de la reserva esten introducidos
 * @param inicio fecha de inicio de la reserva
 * @param fin fecha de fin de la reserva
 * @param jCTipoHab tipo de habitacion (normal/cabaña)
 * @return TRUE si todos los campos estan introducidos, FALSE si falta algun campo por introducir
 */

     public boolean validarDatosReserva(DateChooserCombo inicio,DateChooserCombo fin, JComboBox jCTipoHab)
    {

      if( inicio.getText().equals("") || fin.getText().equals("") || jCTipoHab.getSelectedItem().equals("Seleccionar:"))
          return false; // esto indica que el usuario olvidó colocar un dato de la reserva
      else
          return true;  //la reserva tiene todos sus datos
    }

     /**
      * firma que verifica que las contraseñas introducidas por el cliente son iguales
      * @param password contraseña del clietne
      * @param confirmaPassword segunda contraseña, verfica la primera
      * @return TRUE si la dos contraseñas son iguales, FALSE si son distintas
      */

     public boolean validaPasswordCliente(String password, String confirmaPassword)
    {
         if(password.equals(confirmaPassword))
             return Boolean.TRUE;
        return Boolean.FALSE;
    }

     /**
      * firma que se encarga de mostra los datos de una reserva al cliente
      * @param cedula cedula del cliente
      * @param id Id del cliente
      */

public void DatosReserva(JTextField cedula,JTextField id)
   {
      String palabra="";
      DireccionIP IP = new DireccionIP();
        try {
            IP.abrirArchivoTxt();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ComunicaReserva.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ComunicaReserva.class.getName()).log(Level.SEVERE, null, ex);
        }
      String ip = IP.getDireccionIp();

     ClienteSocket cliente = new ClienteSocket();
     if (cedula.getText().equals("")== false && id.getText().equals("")== false)
     {
     palabra = cliente.ejecutarPeticion("4:"+cedula.getText()+":"+Integer.parseInt(id.getText()),ip, 7687);
     String[] subArg = palabra.split(":");
     if (subArg[0].equalsIgnoreCase("null") && subArg[1].equalsIgnoreCase("null") && subArg[2].equalsIgnoreCase("null") &&  subArg[3].equalsIgnoreCase("null") &&  subArg[4].equalsIgnoreCase("null"))
      JOptionPane.showMessageDialog(null, "La reserva no está registrada en el sistema. " +
                                             "Verifique que algún dato no esté correcto", "Error",
                    JOptionPane.ERROR_MESSAGE);

     else
     {
     ventanaInfoReserva laVentanaInfo= new ventanaInfoReserva();
     laVentanaInfo.setVisible(true);
     laVentanaInfo.setjTFId(subArg[0]);
     laVentanaInfo.setjTFFechaI(subArg[1]);
     laVentanaInfo.setjTFFechaF(subArg[2]);
     laVentanaInfo.setjTFNumHabitacion(subArg[3]);
      if(subArg[4].equalsIgnoreCase("null") == false)
     laVentanaInfo.setjTFNumPersonas(subArg[4]);
      else
         laVentanaInfo.setjTFNumPersonas("0");

     }
    }
   }

   /**
    * firma que se encarga de generar un Id
    * @return el Id de la habitacion
    */

     public int generarIdHab()
     {
       int x;
      Random random=new Random ();
      x=random.nextInt(10);
      x=x+1;
     return x;
   }

    /**
     * firma para verificar que el rango de fechas introducidas por el cliente esten correctas
     * @param inicio fehca de inicio de la reserva
     * @param fin fecha fin de la reserva
     * @return boolean, TRUE estan bien introducidas, FALSE no lo estan
     */
     public boolean ver (DateChooserCombo inicio, DateChooserCombo fin)
  {
    String fecha3,dia,mes,annio,dia2,mes2,annio2;
      fecha3=inicio.getText();

        dia="";
         mes="";
         annio="";

         dia2="";
         mes2="";
         annio2="";

         dia=dia+fecha3.charAt(0)+fecha3.charAt(1);
         mes=mes+fecha3.charAt(3)+fecha3.charAt(4);
         annio=annio+fecha3.charAt(6)+fecha3.charAt(7)+fecha3.charAt(8)+fecha3.charAt(9);

         fecha3=fin.getText();

         dia2=dia2+fecha3.charAt(0)+fecha3.charAt(1);
         mes2=mes2+fecha3.charAt(3)+fecha3.charAt(4);
         annio2=annio2+fecha3.charAt(6)+fecha3.charAt(7)+fecha3.charAt(8)+fecha3.charAt(9);

       if (Integer.parseInt(annio2)>Integer.parseInt(annio))
         return true;
       else if (Integer.parseInt(annio2)==Integer.parseInt(annio) && Integer.parseInt(mes2)>Integer.parseInt(mes))
        return true;
       else if (Integer.parseInt(annio2)==Integer.parseInt(annio) && Integer.parseInt(mes2)==Integer.parseInt(mes) && Integer.parseInt(dia2)>Integer.parseInt(dia))
        return true;
       else
        return false;
  }
  public Boolean validarDatosConsultaReserva (JTextField jTFConsultaCedula, JTextField jTFConsultaIdRes)
  {
      if (jTFConsultaCedula.getText().equals("") || jTFConsultaIdRes.getText().equals(""))
          return false;
      return true;
  }
   /**
    * firma que se encarga de generar un Id
    * @return el Id de la habitacion
    */

    

}